← Writeups

Exploiting exact-match cache rules for web cache deception

Web cache deception con reglas de caché exact-match: ; y ? actúan como delimitadores y el cache server resuelve path traversal, cacheando /my-account bajo /robots.txt.

Target Overview & Vulnerability Summary

El objetivo es cambiar el email del usuario administrator. El cache server usa reglas de caché de tipo exact-match sobre paths concretos (/robots.txt), mientras que el origin server trata ; y ? como delimitadores. El cache server, además, normaliza secuencias de path traversal. La URL /my-account;%2f%2e%2e%2frobots.txt hace que el origin sirva /my-account y que el cache server lo guarde bajo la clave cacheable /robots.txt.

Campo Valor
Severidad Alta (mutación de estado autenticado vía caché — cache poisoning del flujo)
Endpoint vulnerable /my-account (cacheado bajo /robots.txt)
Root cause Reglas de caché exact-match + delimitadores (;, ?) y normalización de path traversal divergentes entre cache y origin

Credenciales del laboratorio: wiener:peter. Se dispone de una lista de caracteres delimitadores.

Technical Breakdown & Exploitation Flow

1. Reconocimiento de delimitadores y normalización

  • Delimitadores: probando con ; y ? se confirma que ambos funcionan como delimitadores para el origin: /my-account;anything o /my-account?anything siguen resolviendo /my-account.
  • Normalización en caché: al recuperar un asset estático con una secuencia de path traversal, el cache server la resuelve y cachea el resultado. Con GET /asdf/..%2ffavicon.ico la caché normaliza a /favicon.ico. Esto no funciona con recursos dinámicos como /my-account de forma directa, pero sí combinando delimitador + traversal.

2. La request deceptiva

GET /my-account;%2f%2e%2e%2frobots.txt HTTP/2
Host: <LAB-ID>.web-security-academy.net
Cookie: session=<SESSION_ID>

Comportamiento:

  • Cache server: decodifica %2f → /, %2e%2e → .., y resuelve la secuencia de path traversal: /my-account;/../robots.txt → /robots.txt. El path final coincide con la regla exact-match de /robots.txt, que es cacheable, y guarda la respuesta bajo esa clave.
  • Origin server: usa ; como delimitador, ignora ;%2f%2e%2e%2frobots.txt y sirve la página real /my-account — con el formulario de cambio de email (y su CSRF token) del usuario autenticado.

3. Explotación

  1. Entregar https://<LAB-ID>.web-security-academy.net/my-account;%2f%2e%2e%2frobots.txt al usuario administrator (p. ej. vía el exploit server).
  2. El origin responde con la página de /my-account de administrator; el cache server la guarda bajo /robots.txt.
  3. El atacante consulta GET /robots.txt (o la clave cacheada) y obtiene el HTML de la cuenta del administrador, incluido el formulario con el token CSRF.
  4. Con el CSRF token válido y el email objetivo, se envía POST /my-account/change-email con email=<attacker> completando la mutación.

Root Cause Analysis

Dos discrepancias se combinan:

  1. Delimitadores de path: el origin server acepta ; (y ?) como separadores, por lo que el path efectivo es /my-account. El cache server no conoce esa semántica y trata la cadena completa como un único path.
  2. Normalización + exact-match: el cache server resuelve la secuencia de traversal y la normaliza a /robots.txt, un path con regla de caché exact-match.

El resultado es que una página dinámica autenticada se clasifica como un asset estático cacheable. La regla exact-match (robots.txt) se convierte en la puerta de entrada para almacenar y leer contenido ajeno.

Secure Remediation

  • Rechazar en el origen los caracteres que actúan como delimitadores no estándar (;) o normalizar de forma idéntica en ambas capas.
  • No aplicar reglas de caché exact-match sin validar que el path no contenga secuencias de traversal ni delimitadores; el cache key debe normalizarse con la misma lógica que el origin.
  • Marcar como Cache-Control: private, no-store todas las respuestas que contienen cookies de sesión, tokens CSRF o datos de cuenta.
  • Rechazar o descartar requests cuyo path contenga parámetros de ruta (;) en endpoints sensibles.